/*
 * © 2024 huayunliufeng保留所有权利, 依据MIT许可证发布。
 * 请勿更改或删除版权声明或此文件头。
 * 此代码是免费软件, 您可以重新分发和/或修改它。
 * 开源是希望它有用, 但不对代码做任何保证。
 * 如有疑问请联系: huayunliufeng@163.com
 */

package io.github.huayunliufeng.common.intface;

import java.util.Objects;

/**
 * 执行一个参数有返回值的方法.
 *
 * @author zhongq
 * @datetime 2024/3/25 10:50
 */
@FunctionalInterface
public interface OneReturnFunction<T, R> {
    R apply(T t) throws Exception;

    default <V> OneReturnFunction<V, R> compose(OneReturnFunction<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> OneReturnFunction<T, V> andThen(OneReturnFunction<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    static <T> OneReturnFunction<T, T> identity() {
        return t -> t;
    }
}
